package com.t4.common.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.core.env.Profiles;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;

@Configuration
@EnableSwagger2WebMvc
public class Knife4jConfig {

    /**
     * 1. Swagger 的实例 Bean 是 Docket，所以通过配置 Docket 实例来配置 Swagger
     * 2. Docket 的构造函数需要一个 DocumentationType 作为参数
     * 3. apiInfo 接口基本信息
     * 4. groupName 分组选项，一般项目中不同的开发人员，可以创建不同的分组，默认的分组是 default。
     *    可以通过配置多个 Docket 去实现分组
     * 5. useDefaultResponseMessages 默认状态码，设置 false 关闭 Swagger 提供的默认状态码
     * 6. select Docket 通过 select 方法配置怎么扫描接口，它会返回一个 ApiSelectorBuilder 对象。
     *    它需要配置 RequestHandlerSelector 和 PathSelectors
     * 7. apis 配置 RequestHandlerSelector 接口扫描方案
     *    basePackage() 扫描指定路径
     *    any() 扫描所有
     *    none() 不扫描接口
     *    withClassAnnotation() 扫描注解
     *    withMethodAnnotation() 扫描注解上的方法，withMethodAnnotation(GetMapping.class) 只扫描 @GetMapping 标识的 GET 请求
     *    withClassAnnotation() 扫描类上的注解，withClassAnnotation(Controller.class) 只扫描有 @Controller 注解的类中的接口
     * 8. paths 配置 PathSelectors 接口路径过滤方案
     *    any() 任何路径都满足条件
     *    none() 任何路径都不满足条件
     *    regex() 通过正则表达式控制
     *    ant() 通过 ant 控制
     * 9. enabled 是否启动 Swagger，可以根据当前项目的环境来决定是否开启 Swagger
     */
    @Bean
    public Docket AdminApiConfig(Environment environment) {

        // 设置要显示 Swagger 的环境
        Profiles of = Profiles.of("dev", "test");
        //判断当前是否处于该环境
        boolean flag = environment.acceptsProfiles(of);

        Docket docket=new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(ApiInfoBuilder())
                .enable(flag)
                .groupName("adminApi")
                .useDefaultResponseMessages(false)
                .select()
                //这里指定Controller扫描包路径
                .apis(RequestHandlerSelectors.basePackage("com.t4"))
                .paths(PathSelectors.regex("/admin/.*"))
                .build();
        return docket;
    }



    private ApiInfo ApiInfoBuilder(){
        return new ApiInfoBuilder()
                .title("后台管理系统-API文档") //文档标题
                .description("后台管理系统接口定义") // 文档描述
                .version("1.0") // API 版本
                .contact(new Contact("t4dmw", "https://blog.csdn.net/weixin_51367845", "3101663227@qq.com")) // 联系人信息
                .build();
    }
}
